package com.woniuxy.project.dlx;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class DeadLetterListener {

    /**
     * 消息确认、消费者可靠性保证
     * 模拟异常，手动应答
     */
    @RabbitListener(queues = "normal.queue")
    public void handle(String content, Channel channel, Message message) throws IOException {
        try {
            // 模拟出现异常
            int m = 1 / 0;
            System.out.println("消费者收到 confirm.queue 消息：" + content);
            // 必须要手动应答，因为开启了消费者手动确认模式，批量应答：false
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            // 获取重投标记（第一次 catch 没有重投过）
            Boolean redelivered = message.getMessageProperties().getRedelivered();
            if (!redelivered) {
                // 没有重投过   消费失败了，就重投   批量重投：false   重新入队：true
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
            } else {
                // 重投过   消费失败了，就拒绝   重新入队：true
                channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
                // 被拒绝后进入死信队列（解决消息丢失问题）
            }
        }
    }

}
